﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace CRM.Database.Model
{
    /// <summary>
    /// Расширенный класс для подачи заявки со списком участников
    /// </summary>
    public class TrainingsRequestsExt
    {
        public TrainingsRequestsExt()
        {
            ParticipantsList = new List<TrainingsParticipants>();
            Request = new TrainingsRequests();
            ParticipantItem = new TrainingsParticipants();
        }

        public TrainingsRequests Request { get; set; }
        public List<TrainingsParticipants> ParticipantsList { get; set; }
        public TrainingsParticipants ParticipantItem { get; set; }
        public int? Key { get; set; }

        public bool IsWebinar
        {
            get
            {
                var schedulesCol = new TrainingsSchedulesCollection();
                if (Request.IdTrainingsSchedule != null)
                {
                    var schedule = (TrainingsSchedules) schedulesCol.GetItemById((int) Request.IdTrainingsSchedule);
                    {
                        if (schedule != null)
                        {
                            if (schedule.IdTrainingCoursesType == 3)
                            {
                                return true;
                            }
                        }
                    }
                }
                return false;
            }
        }

        public int IdLegalEntity { get; set; }
        public int IdContact { get; set; }
        public DateTime ScheduleDate { get; set; }
        public int IdTrainingsTrainer { get; set; }
        public int IdTrainingsAuditorium { get; set; }
        public int IdTrainingsCity { get; set; }
        public int IdTrainingsPlace { get; set; }
        public int IdTrainingsCourse { get; set; }

        /// <summary>
        /// добавить участника к расширенной заявке
        /// </summary>
        /// <param name="participant"></param>
        /// <returns></returns>
        public bool AddParticipant(TrainingsParticipants participant)
        {
            if (Key == null || participant == null) return false;
            if (ParticipantsList.Count > 0)
            {
                int id = ParticipantsList.Max(p => p.IdTrainingsParticipant);
                participant.IdTrainingsParticipant = ++id;
                participant.Fill();
                ParticipantsList.Add(participant);
                return true;
            }
            participant.IdTrainingsParticipant = 1;
            ParticipantsList.Add(participant);
            return true;
        }

        /// <summary>
        /// удалить участника из расширенной заявки
        /// </summary>
        /// <param name="participant"></param>
        /// <returns></returns>
        public bool DeleteParticipant(TrainingsParticipants participant)
        {
            if (Key == null || participant == null) return false;
            foreach (TrainingsParticipants item in ParticipantsList)
            {
                if (item.IdTrainingsParticipant == participant.IdTrainingsParticipant)
                {
                    ParticipantsList.Remove(item);
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// изменить участника в расширенной заявке
        /// </summary>
        /// <param name="participant"></param>
        /// <returns></returns>
        public bool UpdateParticipant(TrainingsParticipants participant)
        {
            if (Key == null || participant == null) return false;
            foreach (TrainingsParticipants item in ParticipantsList)
            {
                if (item.IdTrainingsParticipant == participant.IdTrainingsParticipant)
                {
                    item.ParticipantName = participant.ParticipantName;
                    item.ParticipantPosition = participant.ParticipantPosition;
                    item.IdTrainingsParticipantsStatus = participant.IdTrainingsParticipantsStatus;
                    item.Fill();
                    return true;
                }
            }
            return false;
        }

        /// <summary>
        /// сохранение расширенной заявки
        /// </summary>
        /// <returns></returns>
        public bool SaveToDb(string username)
        {
            if (string.IsNullOrEmpty(username)) return false;
            //добавление заявки в базу
            var requestsCol = new TrainingsRequestsCollection();
            if (!requestsCol.Add(Request, username)) return false;
            if (Request.IdTrainingsRequest < 1) return false;
            //добавление участников в базу
            var participantsCol = new TrainingsParticipantsCollection();
            participantsCol.AddList(ParticipantsList, Request.IdTrainingsRequest, username);
            return true;
        }

        /// <summary>
        /// заполнение нулевых значение пустыми строками
        /// </summary>
        public void Fill()
        {
            if (Request == null) return;
            Request.Fill();
        }

        /// <summary>
        /// Обновление расширенной заявки в базу
        /// </summary>
        /// <param name="username"></param>
        /// <returns></returns>
        public bool UpdateToDb(string username)
        {
            if (Request == null) return false;
            if (string.IsNullOrEmpty(username) || Request.IdTrainingsRequest < 1) return false;

            // получить старый список участников заявки
            var oldList = Request.Participants;

            //Лист ID участников на удаление
            var delIdList = new List<int>();

            //Лист ID обновленных участников
            var updateIdList = new List<int>();
            foreach (TrainingsParticipants item in ParticipantsList)
            {
                if (item.IdTrainingsRequest > 0)
                    updateIdList.Add(item.IdTrainingsParticipant);
            }

            //получить коллекцию участников
            var participantsCol = new TrainingsParticipantsCollection();
            if (oldList.Count > 0)
            {
                foreach (TrainingsParticipants item in oldList)
                {
                    if (!updateIdList.Contains(item.IdTrainingsParticipant))
                    {
                        item.IdTrainingsRequest = Request.IdTrainingsRequest;
                        participantsCol.Add(item, username);
                    }
                }
            }

            foreach (TrainingsParticipants item in ParticipantsList)
            {
                //обновить существующих участников
                if (item.IdTrainingsRequest > 0)
                {
                    item.IdTrainingsRequest = Request.IdTrainingsRequest;
                    participantsCol.Update(item, username);
                }

                //добавить новых участников к заявке
                if (item.IdTrainingsRequest == 0)
                {
                    item.IdTrainingsRequest = Request.IdTrainingsRequest;
                    participantsCol.Add(item, username);
                }
            }

            //обновить заявку
            var requestsCol = new TrainingsRequestsCollection();
            Request.Fill();
            requestsCol.Update(Request, username);
            return true;
        }
    }
}